package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.util.Jwtutil;
import com.heima.common.util.MD5Utils;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.UUID;

@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
    /**
     * day01-登录
     *
     * @param dto
     * @return ResponseResult
     */
    @Override
    public ResponseResult login(LoginDto dto) {
        // TODO: 定义存放响应数据的map
        HashMap<String, Object> map = new HashMap<>();
        //I:dto中有数据->用户
        /*
        成功返回：token+Map<User>
        失败返回：密码错误
         */
        if (!ObjectUtils.isEmpty(dto.getPassword()) && !ObjectUtils.isEmpty(dto.getPhone())) {
            // 1 查询数据库中对应phone用户数据
            LambdaQueryWrapper<ApUser> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(ApUser::getPhone, dto.getPhone());
            ApUser apUser = this.getOne(wrapper);
            if (apUser != null) {
                // 2 password+salt，密码验证
                String pwd = MD5Utils.encodeWithSalt(dto.getPassword(), apUser.getSalt());
                if (pwd.equals(apUser.getPassword())) {
                    // 2.1 密码正确，封装结果数据
                    map.put("id", apUser.getId());
                    map.put("name", apUser.getName());
                    map.put("phone", apUser.getPhone());
                    map.put("image", apUser.getImage());
                    // 2.2 生成token
                    String token = Jwtutil.token(map);
                    // 2.3 二次封装->响应数据
                    HashMap<String, Object> resp = new HashMap<>();
                    resp.put("user", map);
                    resp.put("token", token);
                    // 2.4 响应前端
                    System.out.println("用户用户111");
                    return ResponseResult.okResult(resp);
                }
            }
            // 3 其他情况：密码错误、账号错误
            System.out.println("用户用户222");
            return ResponseResult.error(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        } else {
            //II:dto中无数据->游客登陆
            /*
            返回id为0的token
             */
            map.put("id", 0L);
            String token = Jwtutil.token(map);
            System.out.println("游客游客");
            return ResponseResult.okResult(token);
        }
    }

    /**
     * day01-注册
     *
     * @param apUser
     * @return ResponseResult
     */
    @Override
    public ResponseResult register(ApUser apUser) {
        // 1 查询手机号->存在：提示“已注册”
        LambdaQueryWrapper<ApUser> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ApUser::getPhone, apUser.getPhone());
        ApUser one = this.getOne(wrapper);
        System.out.println("88888");
        if (!ObjectUtils.isEmpty(one)) {
            System.out.println("1111");
            return ResponseResult.okResult(AppHttpCodeEnum.NEED_LOGIN_EXIST.getCode(), AppHttpCodeEnum.NEED_LOGIN_EXIST.getMessage());

        }
        System.out.println("33333");
        // 2 根据uuid生成“密码salt”
        String salt = UUID.randomUUID().toString().replace("-", "");
        apUser.setSalt(salt);
        // 3 根据md5算法对用户输入的密码，加盐处理
        String pwd = MD5Utils.encodeWithSalt(apUser.getPassword(), salt);
        apUser.setPassword(pwd);
        // 4 保存注册信息，并返回
        this.save(apUser);
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

}
